先說這 30 天是什麼:不是教學,是一個真實商業系統的軟體開發實錄——設計、取捨、事故,和「如果重來」。
這是一個新系列,也是這個部落格第一個戰爭故事。我在前公司實際做過一個直播代購電商平台——使用者看直播、在留言區打字下單,後面接著庫存、金流、物流一整條鏈。這系列不是回憶錄:我想帶著現在的功力(DDIA、Redis、Kafka、SRE 都重新讀過一輪之後)把當年的仗重打一次——每章從一個真實需求出發,先講當年怎麼做、踩了什麼,再給重來版的設計。第一篇先把全景鋪開。
規則其實很簡單:
2601+2:key + 數量,這樣就是下單 2 件。2601+2 又改打 2601+1,就是買 1 件。每一條規則單看都是一個週末的工作量。難的是把它們放在同一句話裡:三千人同時留言,搶 20 件庫存,一半的人沒帳號,留言來自三個平台——這才是這個系統真實的樣子。
先看一筆訂單從留言到出貨的完整路徑,這條路徑就是整個系列的目錄:

每一站展開都有自己的取捨,細節留給各章;這裡只點出每站「真正的問題是什麼」:
fb:12345,不是我們的會員。庫存要卡給這個身分,帳號之後才出現、再把單認領回去。這是全系列最容易被低估的一章。功能列表不難,難的是三個橫貫整條鏈的性質:
當年的系統其實已經摸到這個門口:留言抓進來會先清洗、落地進 DB,再由一個 job 批次消費。重來,我只做一件事——把這個當年只當成「緩衝」的東西,扶正成整個架構的中心:留言不是待處理的輸入,是要永久留下的事實:

這個架構的三個主張,也是整個系列反覆出現的主旋律:
fb:12345 這個 identity,帳號註冊後再認領。身分先於帳號,是這個業務跟一般電商最不一樣的地方。系列照一筆訂單的旅程排,再加上維運與演進的縱深(章節還在長,以最新的系列列表為準):
是把「落地」當成緩衝,而不是事實來源。我們其實做對了一半:留言抓進來會先清洗、寫進 DB,再批次消費——已經是半個 event log。但清洗完原文就丟了,清洗規則漏接的留言永遠追不回來;批次處理失敗的留言直接略過,沒有留痕、沒有補救路徑,那位顧客就無聲消失。這是當年刻意的取捨:為了讓主播看到最快的庫存狀態,寧可掉單。而快其實也沒守住——尖峰時消費跟不上,留言到下單成功可以差到幾分鐘,主播那頭的庫存認知跟系統對不上,客訴就是從那幾分鐘裡長出來的。重來我仍然會選快——但快可以用「晚點處理」換,不能用「丟掉事實」換:事實還在,晚到的單補得回來、客訴查得到人;事實丟了,連道歉都不知道要跟誰道。
功能寫錯,改掉重上就好;超賣是把不存在的貨賣掉,要一個一個跟客人道歉退款,信任賠進去就回不來。所以這個系統裡「不能超賣」「錢帳對齊」「介接冪等」這三條,我重來會在第一天就寫進設計文件的第一頁——不是因為優雅,是因為這三條的違約成本是用商譽付的。這也是我寫這系列想傳達的核心:電商系統的難,不在功能,在不變量。
因為「如果重來你會怎麼設計」是我自己面試別人最愛問的問題,而我發現最誠實的回答方式,是拿一個自己真的做過、真的做錯過的系統來答。接下來每一章都會有兩個聲部:當年怎麼做、為什麼那樣做;重來怎麼做、又為什麼。有趣的從來不是標準答案,是中間那段差距——那才是這幾年真正學到的東西。
本文改寫自我的部落格系列《Re:從零開始做直播代購電商平台》,本篇完整版:https://blog.aidan.tw/blog/rezero-overview/